package com.hspedu.qqclient.service;

import com.hspedu.qqcommon.Message;
import com.hspedu.qqcommon.MessageType;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;

/**
 * @author 谷其昊
 * @version 1.0
 * @date 2022/3/17
 * @time 19:36
 */
public class ClientConnectServerThread extends Thread {
    /**
     * 将Socket设置为当前类的属性
     */
    private Socket socket;

    public ClientConnectServerThread(Socket socket) {
        this.socket = socket;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        //每个线程的目的就是获取当前套接字
        //利用这个套接字来继续与服务器连接
        while (true) {
            try {
                //判断message类型,做不同的处理
                //如果服务器没有发送过来数据，会阻塞在这里
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
                Message acceptMessage = (Message) objectInputStream.readObject();
                if (MessageType.MESSAGE_RETURN_ONLINE_FRIEND.equals(acceptMessage.getMessageType())) {
                    //服务器返回的在线用户列表
                    String content = acceptMessage.getContent();
                    String[] allContents = content.split(" ");
                    System.out.println("\n=======当前用户在线列表=======");
                    for (String eachContent : allContents) {
                        System.out.println(eachContent);
                    }
                }else if(MessageType.MESSAGE_COMM_MES.equals(acceptMessage.getMessageType())){
                    //普通私聊消息 也可能是服务器发送过来的消息
                    //获取到发送方发送过来的消息
                    String content = acceptMessage.getContent();
                    //获取发送方
                    String sender = acceptMessage.getSender();
                    //获取发送方发送消息的时间
                    String sendTime = acceptMessage.getSendTime();
                    System.out.println(sender+"在"+sendTime+"时间发送过来的信息为："+content);
                }else if(MessageType.MESSAGE_TO_ALL.equals(acceptMessage.getMessageType())){
                    String content = acceptMessage.getContent();
                    //获取发送方
                    String sender = acceptMessage.getSender();
                    //获取发送方发送消息的时间
                    String sendTime = acceptMessage.getSendTime();
                    System.out.println(sender+"在"+sendTime+"时间发送过来的信息为："+content);
                }else if (MessageType.MESSAGE_BINARY_DATA.equals(acceptMessage.getMessageType())){
                    //这里还可以改进为让接收方指定文件保存路径
                    //但是一个进程一个控制台，比较难实现，这个功能暂且放弃
                    String destFilePath = acceptMessage.getDestFilePath();
                    File destFile = new File(destFilePath);
                    byte[] binaryContent = acceptMessage.getBinaryContent();
                    FileOutputStream fileOutputStream = new FileOutputStream(destFile);
                    fileOutputStream.write(binaryContent);
                    fileOutputStream.close();
                }
                else {
                    System.out.println("是其它类型的message,暂时不做处理");
                }

            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

        }
    }
}
